\chapter{WPF a 3D} \label{chap:wpf3d}

Celá sekce \textbf{WPF a 3D} byla vypracována v rámci předmětu Projektu 5 a~bylo čerpáno zejména z knihy ,,Programming WPF. 2nd ed.''. \cite{oreaillybook}

Tato technologie je úzce vázaná na Windows a DirectX. Zatímco Windows Forms trpěly tím, že byly napřímo rasterizovány, WPF technologie jde cestou opačnou, tedy vše vykreslit vektorově a zobrazení ponechat na grafické kartě. Grafika je proto hardwarově akcelerovaná, ale to neznamená, že by WPF byla tou správnou volbou pro tvorbu náročných 3D aplikací či her. 3D se zde využívá pro vytvoření zajímavých efektů či zobrazení jednoduchých modelů.

Udává se, že by modely neměly přesahovat více než 20 000 bodů a 60 000 trojúhelníků. Pro náročnější aplikace je vhodné zvolit technologii jinou.

Všechny prvky ve WPF lze zapsat deklarativně pomocí \textit{XAMLu} či procedurálně v kódu. Oba způsoby lze také kombinovat pomocí bindingu. \newline{}\cite{msdn}

\begin{figure}[h!tb]
\begin{center}
\includegraphics[width=0.85\textwidth]{img/projection}
\end{center}
\caption{Projekce \cite{wpftutorial}}
\label{fig:projection}
\end{figure}

\section{Základy 3D}

Základní stavební kámen 3D grafiky je počítačový model jakožto \textbf{objekt}. Protože naše obrazovky jsou ale dvourozměrné, je nutné tyto objekty nějakým způsobem převést na 2D obraz (viz obr. \ref{fig:projection}). Tento převod se nazývá \textbf{rendering}. Pro rendering je nutné definovat, odkud se na model díváme, tedy určit pozici \textbf{kamery}. Abychom vůbec něco mohli pozorovat, je nutné také definovat zdroj \textbf{světla}. 

A protože svět kolem nás je plný barev, je také vhodné nadefinovat \textbf{materiál} daného objektu. Např. ho můžeme obarvit jednou barvou nebo zobrazit tak, aby vypadal jako dřevo. Protože dřevo není jednobarevné, použijeme například obrázek dřeva, tedy \textbf{texturu}.

Svět v počítačové grafice je složen z trojúhelníků a dnešní hardware je uzpůsoben právě k tomu, aby uměl s trojúhelníky pracovat rychle. \cite{wpftutorial}

\subsubsection{Vlastnosti trojúhelníků}

\begin{itemize}
	\item je vždy konvexní
	\item definuje plochu/rovinu
	\item každý polygon lze definovat jako sadu trojúhelníků (princip triangulace) 
\end{itemize}

\begin{figure}[h!tb]
\begin{center}
\includegraphics[width=0.65\textwidth]{img/triangles}
\end{center}
\caption{Popis meshe \cite{wpftutorial}}
\label{fig:triangles}
\end{figure}

Jakýkoliv objekt lze (s jistou odchylkou) rozložit na síť trojúhelníků. Tato síť se nazývá \textbf{mesh} (viz obr. \ref{fig:triangles}). Síť je definován výčtem bodů ve 3D prostoru. Tyto body se nazývají vrcholy (angl. vertex, plur. \textbf{vertices}). Jednotlivé vrcholy se spojují do tzv. trojúhelníků (angl. \textbf{triangle(s)}). Každý trojúhelník má dvě strany, přední a zadní. Přední strana je definována pomocí takzvaného pravidla pravé ruky, tedy záleží na pořadí, v jakém jsou trojúhelníky skládány.

\section{3D Kontejner}

Základní prvek WPF pro zobrazení trojrozměrného prostoru je \textbf{Viewport3D}. Tento prvek definuje prostor v obrazovce, pomocí něhož se pohlíží na scénu do světa 3D.

\textit{Viewport3D} v sobě zapouzdřuje všechna data o nastavení kamery, světel a všech 3D modelech popř. informace o jejich transformaci.
K tomu, abychom zobrazili trojrozměrný prostor, musíme nadefinovat tři věci. Kameru, alespoň jeden zdroj světla (jinak bychom nic neviděli) a model.

\section{Souřadnice v prostoru}

Vykreslování ve dvourozměrném prostoru je zajištěno z~levého horního rohu renderovací oblasti (typicky pak obrazovky). X-ová osa je kladná ve směru z levé strany do pravé strany, Y-ová osa pak shora dolů, jak je naznačeno na obr. \ref{fig:coords}. Toto využijeme zejména u texturování.

V trojrozměrném systému je tomu jinak. Počáteční bod je uprostřed renderovaní části, x-ová osa je shodná s vykreslováním v 2D prostoru, ale Y-ová osa je obráceně, tedy kladná směrem nahoru a záporná směrem dolů. Z-ová osa je pak kladná směrem k pozorovateli.

Toto využijeme zejména u sestavování 3D modelu.

\begin{figure}[h!tb]
\begin{center}
\includegraphics[width=0.85\textwidth]{img/coords}
\end{center}
\caption{Souřadnice v prostoru \cite{msdn}}
\label{fig:coords}
\end{figure}

\newpage{}
\section{Kamery}

Viewport3D v současné době umožňuje nastavení tří typů kamer: PerspectiveCamera, OrthographicCamera a MatrixCamera (viz obr. \ref{fig:projection2}). Pomocí těchto kamer můžeme měnit pohled na trojrozměrný svět.

\begin{figure}[h!tb]
\begin{center}
\includegraphics[width=0.85\textwidth]{img/projection2}
\end{center}
\caption{Rozdíl mezi projekcemi \cite{msdn}}
\label{fig:projection2}
\end{figure}

Lidskému oku nejpřirozenější je kamera perspektivní, která vzdálené objekty zobrazuje menší. Tento pohled se nejvíce přibližuje reálnému světu.

Oproti tomu kamera ortografická je jednoduchá, zobrazuje objekty tak, jak si je nadefinujeme, a nedochází k žádné deformaci. Tento pohled se využívá u CAD systému, kde nám nejde o reálný pohled, ale o skutečné rozměry, dle kterých budeme řídit konstrukce.

\subsection{Perspektivní kamera}

Základní nastavení této kamery je její umístění - \textit{Position} a směr - \textit{LookDirection}, kterým budeme hledět na trojrozměrný prostor. Perspektivní kameru si lze představit jako jehlan, který má vrchol v bodu, který jsme nastavili jako pozici kamery, směřuje na 3D-scénu. U tohoto pohledového jehlanu můžeme navíc nastavit úhel – \textit{FieldOfView}, tedy záběr kamery. S kamerou lze také otáčet pomocí parametru \textit{UpDirection}, který nastavuje směr vzhůru do kamery. Defaulftně je tento parametr nastaven v kladném směru osy Y.

\begin{figure}[h!tb]
\begin{center}
\includegraphics[width=1\textwidth]{img/perscamera}
\end{center}
\caption{Jehlan perspektivní kamery \cite{libgdx}}
\label{fig:perscamera}
\end{figure}

\newpage{}

Závěrem je třeba nastavit ořezávání jehlanu pomocí dvou ploch. První, ta bližší, udává plochu, před kterou nebude žádný objekt vykreslen, zadní naopak schová vše za ní (\textit{NearPlaneDistance} a \textit{FarPlaneDistance}).

\lstset{
	caption=Ukázka nastavení perspektivní kamery,
  language = xml,
	breaklines=true,
  showspaces = false,
  showstringspaces=false,
  showtabs = false,
  basicstyle = \ttfamily\footnotesize,
	tabsize=2,
	frame=single
	}
\begin{lstlisting}
<Viewport3D>
	<Viewport3D.Camera>
		<PerspectiveCamera UpDirection="0,1,0" Position="0,0,5" LookDirection="0,0,-1" FieldOfView="45" NearPlaneDistance="3" FarPlaneDistance="50" />
	</Viewport3D.Camera>
</Viewport3D>
\end{lstlisting}

\subsection{Ortografická kamera}

Zásadní rozdíl mezi perspektivní a ortografickou kamerou je způsob ořezávání prostoru. Zatímco perspektivní kamera využívá jehlan, ortografická si vystačí s kvádrem.

\begin{figure}[h!tb]
\begin{center}
\includegraphics[width=0.85\textwidth]{img/ortocamera}
\end{center}
\caption{Kvádr ortografické kamery \cite{libgdx}}
\label{fig:ortocamera}
\end{figure}

Způsob nastavení kamery je tedy velice podobný s tím rozdílem, že nenastavujeme úhel, ale pouze šířku - \textit{Width}, kterou chceme zobrazit.

\lstset{
	caption=Ukázka nastavení ortografické kamery,
  language = xml,
	breaklines=true,
  showspaces = false,
  showstringspaces=false,
  showtabs = false,
  basicstyle = \ttfamily\footnotesize,
	tabsize=2,
	frame=single
	}
\begin{lstlisting}
<Viewport3D>
	<Viewport3D.Camera>
		<OrthographicCamera UpDirection="0,1,0" Position="0,0,5" LookDirection="0,0,-1" Width="10" NearPlaneDistance="3" FarPlaneDistance="50" />
	</Viewport3D.Camera>
</Viewport3D>
\end{lstlisting}

\subsection{Maticová kamera}

Posledním typem kamery je kamera maticová. Tato kamera je zde spíše kvůli přenosu kamery mezi jednotlivými 3D formáty, které právě tímto způsobem uchovávají nastavení.

Maticová kamera se nastavuje pomocí dvou matic typu 4x4. Prvním parametrem je \textit{ViewMatrix}, tento parametr nastavuje pozici a orientaci kamery. Svým způsobem nahrazuje parametry \textit{Position}, \textit{UpDirection} a \textit{LookDirection} z předchozích typů kamer. Druhým parametrem je pak \textit{ProjectionMatrix}, kterým nastavujeme, jak bude 3D prostor transformován do 2D obrazu.

% TODO toto se nelibilo!
% O této kameře se více rozepisovat nebudu, nám budou dostačovat dva předchozí typy.

\section{Modely}

Model je reprezentace 3D modelu pomocí trojúhelníků. Viewport3D smí obsahovat pouze jednu kameru, ale ,,neomezené'' množství modelů. Tyto modely jsou zapouzdřeny do objektu ModelVisual3D. Obsahem tohoto prvku mohou být světla nebo geometrická reprezentace, tedy popis povrchu (\textbf{meshe}) pomocí trojúhelníků. Speciálním prvkem je pak Model3DGroup, který umožňuje tyto prvky kombinovat. Např. lze vytvořit geometrickou reprezentaci koule, která bude zároveň svítit. Pomocí transformace celého ModelVisual3D prvku lze docílit pohybu po obloze.

\section{Světla}
Ve WPF jsou k dispozici celkem 4 typy světel. Světla budou popisovány od výkonově nejméně náročné až po nejnáročnější.

\subsection{Ambientní světlo}

Jde o základní a nejjednodušší světlo. Osvětlí všechny objekty stejně bez ohledu na pozici či orientaci. Vlivem tohoto světla nejsou vidět vůbec stíny, a tak červená koule vypadá jako vyplněná rudá kružnice. Výhodou je samozřejmě výpočetní náročnost. Jediným parametrem tohoto světla je barva.

\begin{figure}[h!tb]
\begin{center}
\includegraphics[width=0.65\textwidth]{img/ambientl}
\end{center}
\caption{Koule pod ambientním světlem}
\label{fig:ambientl}
\end{figure}

\lstset{
	caption=Nastavení ambientního světla,
  language = xml,
	breaklines=true,
  showspaces = false,
  showstringspaces=false,
  showtabs = false,
  basicstyle = \ttfamily\footnotesize,
	tabsize=2,
	frame=single
	}
\begin{lstlisting}
<AmbientLight Color="White" />
\end{lstlisting}

\subsection{Směrové světlo}

Jak už sám název napovídá, jedná se o směrové světlo a lze si ho představit jako zářící slunce. Neudává se tedy pozice, ale pouze směr záření. Po osvětlení modelu se již přibližujeme realitě. Objekty jsou stínované, ale nevrhají stíny mezi sebou.

\begin{figure}[h!tb]
\begin{center}
\includegraphics[width=0.65\textwidth]{img/directl}
\end{center}
\caption{Koule pod směrovým světlem}
\label{fig:directl}
\end{figure}

\lstset{
	caption=Nastavení směrového světla,
  language = xml,
	breaklines=true,
  showspaces = false,
  showstringspaces=false,
  showtabs = false,
  basicstyle = \ttfamily\footnotesize,
	tabsize=2,
	frame=single
	}
\begin{lstlisting}
<DirectionalLight Color="White" Direction="0,0,-1" />
\end{lstlisting}

\subsection{Bodové světlo}

Bodová světla patří do lokálního osvětlovacího modelu, tedy lze pomocí něj simulovat např. světlo pouličních lamp  či lustr. Základní nastavení bodového světla je jeho pozice a barva. Tento typ patří mezi ty výkonově náročnější, ale také umožnuje komplexnější nastavení. 

Existují zde tři koeficienty \textit{ConstantAttenuation (CA)}, \textit{LinearAttenuation (LA)} a \textit{QuadraticAttenuation (QA)}.
Výsledné zeslabení světla se pak počítá podle vzorce \ref{eq:light}, kde \textit{distance} je zdálenost od zdroje světla.


\begin{equation}\label{eq:light}
light = CA + LA * distance + QA * distance^2
\end{equation}

%\vskip 0.7em
%$light = CA + LA * distance + QA * distance^2$ 

Dle nastavení těchto parametrů lze ovlivnit svítivost.

\begin{figure}[h!tb]
\begin{center}
\includegraphics[width=0.65\textwidth]{img/pointl}
\end{center}
\caption{Koule pod bodovým světlem}
\label{fig:pointl}
\end{figure}

\lstset{
	caption=Nastavení bodového světla,
  language = xml,
	breaklines=true,
  showspaces = false,
  showstringspaces=false,
  showtabs = false,
  basicstyle = \ttfamily\footnotesize,
	tabsize=2,
	frame=single
	}
\begin{lstlisting}
<PointLight Color="White" Position="0,0,0" Range="30" ConstantAttenuation="0.5" LinearAttenuation="0.05" QuadraticAttenuation="0.005" />
\end{lstlisting}

\subsection{Reflektorové světlo}

Reflektorové světlo se v zásadě moc neliší od bodového světla. Rozdíl je v~šíření světla. Zatímco bodově světlo je všesměrové, tak reflektorové světlo svítí pouze směrem jedním. 

\begin{figure}[h!tb]
\begin{center}
\includegraphics[width=0.65\textwidth]{img/reflectl}
\end{center}
\caption{Koule pod reflektorovým světlem}
\label{fig:pointl}
\end{figure}

Zásadním parametrem je tedy směr světla – \textit{direction}, osvětlení lze dále ovlivnit pomocí dvou úhlů. \textit{InnerConeAngle} specifikuje oblast, ve které bude světlo v plné intenzitě. V oblasti mezi \textit{InnerConeAngle} a \textit{OuterConeAngle} se bude intenzita postupně snižovat.

\newpage{}

\lstset{
	caption=Nastavení reflektorového světla,
  language = xml,
	breaklines=true,
  showspaces = false,
  showstringspaces=false,
  showtabs = false,
  basicstyle = \ttfamily\footnotesize,
	tabsize=2,
	frame=single
	}
\begin{lstlisting}
<SpotLight Color="White" Position="0,0,0" Direction="0,0,-1" InnerConeAngle="45" OuterConeAngle="90" />
\end{lstlisting}

\section{Geometrická reprezentace}

K popisu samotného modelu v 3D prostoru slouží prvek \textit{MeshGeometry3D}. V~současné době neexistuje jiná možnost, jak popsat model v technologii WPF. Tento prvek popisuje povrch modelu pouze pomocí sady vrcholů, jednotlivých trojúhelníků, normál a koordinátů pro texturování.

\begin{figure}[h!tb]
\begin{center}
\includegraphics[width=0.65\textwidth]{img/cube}
\end{center}
\caption{Krychle}
\label{fig:cube}
\end{figure}

Zatímco např. technologie OpenGL umožňuje i složitější konstrukce než trojúhelníky (strips, fans, polygons, quads aj.), tak WPF technologie podporuje pouze trojúhelníky. Pokud je třeba tyto primitiva načíst, tak je nutné je manuálně převést. U sestavování trojúhelníků je nutné si dát pozor na ,,pravidlo pravé ruky''. Při nastavování koordinátů pro textury je nutné si uvědomit, že 2D má jiný souřadný systém než 3D viz obrázek \ref{fig:texture}.

\newpage{}

\lstset{
	caption=Geometrická reprezentace krychle,
  language = xml,
	breaklines=true,
  showspaces = false,
  showstringspaces=false,
  showtabs = false,
  basicstyle = \ttfamily\footnotesize,
	tabsize=2,
	frame=single
	}
\begin{lstlisting}
<GeometryModel3D.Geometry>
	<MeshGeometry3D Positions="-1,1,1  -1,-1,1  1,-1,1  1,1,1  -1,1,-1  -1,-1,-1  1,-1,-1  1,1,-1" 
		TriangleIndices="0,1,2  0,2,3
			3,2,6  3,6,7
			4,5,1  4,1,0
			7,6,5  7,5,4
			1,5,6  1,6,2
			4,0,3  4,3,7" />
</GeometryModel3D.Geometry>
\end{lstlisting}

\begin{figure}[h!tb]
\begin{center}
\includegraphics[width=0.85\textwidth]{img/texture}
\end{center}
\caption{Mapování textur \cite{codeproject}}
\label{fig:texture}
\end{figure}

\section{Materiál}

Nastavením kamer, světel a vytvořením grafické reprezentace, např. krychle, ještě není trojrozměrná reprezentace viditelná. Důvodem je to, že krychle nemá žádný materiál, tedy není co vykreslovat.

Materiálem může být 2D kresba, barva, a nebo část uživatelského prostředí např. tlačítko. Jednotlivé materiály lze mezi sebou kombinovat a to tak, že je zanoříme do prvku \textit{MaterialGroup}. Základem každého materiálu je parametr \textit{Brush}. 

Typy materiálů jsou seřezeny od výkonově méně náročných až po ty složitější.

\subsection{Emisní materiál}

Zatímco ostatní typy materiálu potřebují světlo k tomu, aby byly vidět, tak emisní materiál sám o sobě ,,svítí''. Ne že by osvětloval okolní objekty, ale lze jej pozorovat bez zdroje světla.

\begin{figure}[h!tb]
\begin{center}
\includegraphics[width=0.65\textwidth]{img/emism}
\end{center}
\caption{Nastavení emisního materiálu}
\label{fig:emism}
\end{figure}

\lstset{
	caption=Nastavení emisního materiálu,
  language = xml,
	breaklines=true,
  showspaces = false,
  showstringspaces=false,
  showtabs = false,
  basicstyle = \ttfamily\footnotesize,
	tabsize=2,
	frame=single
	}
\begin{lstlisting}
<EmissiveMaterial Brush="Green" />
\end{lstlisting}

\newpage{}

\subsection{Difuzní materiál}

Difuzní materiál popisuje tu oblast modelu, kam dopadá světlo. Tato část bude vykreslená matným materiálem, který lze nadefinovat pomocí parametru \textit{Brush}. Oblast, kam nedopadá světlo, bude tmavá (stín). K tomu, abychom takto potažený objekt viděli, musí existovat světlo.

\begin{figure}[h!tb]
\begin{center}
\includegraphics[width=0.65\textwidth]{img/difusem}
\end{center}
\caption{Krychle potažená difuzním materiálem}
\label{fig:difusem}
\end{figure}


\lstset{
	caption=Nastavení difuzního materiálu,
  language = xml,
	breaklines=true,
  showspaces = false,
  showstringspaces=false,
  showtabs = false,
  basicstyle = \ttfamily\footnotesize,
	tabsize=2,
	frame=single
	}
\begin{lstlisting}
<DiffuseMaterial Brush="Red"/>
\end{lstlisting}

\subsection{Spekulární materiál}

Tento typ materiálu definuje lesklý povrch. Zobrazuje odlesky světla a materiál pak více připomíná reálný objekt. Tento typ materiálu se obvykle používá v kombinaci s difuzním materiálem.

\begin{figure}[h!tb]
\begin{center}
\includegraphics[width=0.65\textwidth]{img/specularm}
\end{center}
\caption{Krychle potažená spekulárním materiálem}
\label{fig:specularm}
\end{figure}


Spekulární materiál lze pozorovat pouze pod bodovým nebo reflektorovým světlem. Tento materiál obsahuje ještě jeden parametr navíc. Nazývá se \textit{SpecularPower} a určuje sílu odrazu světla. Čím nižší číslo je, tím je odraz silnější.

\lstset{
	caption=Nastavení spekulárního materiálu,
  language = xml,
	breaklines=true,
  showspaces = false,
  showstringspaces=false,
  showtabs = false,
  basicstyle = \ttfamily\footnotesize,
	tabsize=2,
	frame=single
	}
\begin{lstlisting}
<SpecularMaterial Brush="White" SpecularPower="2" />
\end{lstlisting}

\newpage{}

\subsection{Kombinované materiály}

Jednotlivé materiály lze mezi sebou kombinovat pomocí prvku \textit{MaterialGroup}. Výsledným efektem je pak reálnější zobrazení objektu.

\begin{figure}[h!tb]
\begin{center}
\includegraphics[width=0.65\textwidth]{img/combi}
\end{center}
\caption{Kombinace difuzní a spekulárního materiálu}
\label{fig:combi}
\end{figure}

\newpage{}

\lstset{
	caption=Nastavení MaterialGroup prvku,
  language = xml,
	breaklines=true,
  showspaces = false,
  showstringspaces=false,
  showtabs = false,
  basicstyle = \ttfamily\footnotesize,
	tabsize=2,
	frame=single
	}
\begin{lstlisting}
<GeometryModel3D.Material>
	<MaterialGroup>
		<DiffuseMaterial Brush="Red"/>
		<SpecularMaterial Brush="White" SpecularPower="2" />
	</MaterialGroup>
</GeometryModel3D.Material>
\end{lstlisting}

\section{Transformace}

Jednotlivé modely či celou scénu lze transformovat. Tedy pokud je krychle definována v počátku souřadné soustavy a je potřeba ji posunout, otočit či zmenšit/zvětšit, není nutné redefinovat souřadnice, ale lze použít již stávající a pouze je transformovat.

\subsection{Translace}

Translace neboli posuv. Touto transformací lze pohybovat modelem po jednotlivých osách X, Y nebo Z. Jednotlivé složky pohybu se nastavují pomocí offsetu. Pohyb je zadán relativně. Při pozorování translace je nutné mít správně nastavenou kameru.

\begin{figure}[h!tb]
\begin{center}
\includegraphics[width=0.65\textwidth]{img/translate}
\end{center}
\caption{Ukázka translace}
\label{fig:translate}
\end{figure}

\lstset{
	caption=Nastavení translace po ose X a Z,
  language = xml,
	breaklines=true,
  showspaces = false,
  showstringspaces=false,
  showtabs = false,
  basicstyle = \ttfamily\footnotesize,
	tabsize=2,
	frame=single
	}
\begin{lstlisting}
<TranslateTransform3D  OffsetX="5" OffsetZ="2"/>
\end{lstlisting}

\subsection{Změna velikosti}

\textit{Scaling} neboli změna rozměrů. Tato transformace obsahuje celkem 3 parametry začínající slovem \textit{Scale}. Následuje písmeno označující osu, dle které bude objekt zmenšen či zvětšen. Snadno tak lze z krychle vytvořit kvádr.

\begin{figure}[h!tb]
\begin{center}
\includegraphics[width=0.65\textwidth]{img/scale}
\end{center}
\caption{Dvojnásobné zvětšení po ose Y}
\label{fig:scale}
\end{figure}

\lstset{
	caption=Nastavení zvětšení,
  language = xml,
	breaklines=true,
  showspaces = false,
  showstringspaces=false,
  showtabs = false,
  basicstyle = \ttfamily\footnotesize,
	tabsize=2,
	frame=single
	}
\begin{lstlisting}
<ScaleTransform3D ScaleY="2" />
\end{lstlisting}

\newpage{}

\subsection{Rotace}

Poslední transformací je rotace. Nejprve je nutné zadat osu, dle které bude objekt rotován a pak úhel. Úhel se zadává ve stupních.

\begin{figure}[h!tb]
\begin{center}
\includegraphics[width=0.65\textwidth]{img/rotate}
\end{center}
\caption{Rotace krychle o 25 stupňů v ose X}
\label{fig:rotate}
\end{figure}

\lstset{
	caption=Nastavení rotace,
  language = xml,
	breaklines=true,
  showspaces = false,
  showstringspaces=false,
  showtabs = false,
  basicstyle = \ttfamily\footnotesize,
	tabsize=2,
	frame=single
	}
\begin{lstlisting}
<RotateTransform3D>
	<RotateTransform3D.Rotation>
		<AxisAngleRotation3D Axis="0,1,0" Angle="25" />
	</RotateTransform3D.Rotation>
</RotateTransform3D>
\end{lstlisting}

\newpage{}

\subsection{Skládání transformací}

Jednotlivé transformace se také dají skládat pomocí prvku Transform3DGroup, ale z hlediska výkonnostního se to moc nedoporučuje. Jako alternativa se pak nabízí transformace maticová.

\begin{figure}[h!tb]
\begin{center}
\includegraphics[width=0.65\textwidth]{img/rotate}
\end{center}
\caption{Kombinace transformací}
\label{fig:rotate}
\end{figure}

\lstset{
	caption=Nastavení skládání transformací,
  language = xml,
	breaklines=true,
  showspaces = false,
  showstringspaces=false,
  showtabs = false,
  basicstyle = \ttfamily\footnotesize,
	tabsize=2,
	frame=single
	}
\begin{lstlisting}
<Transform3DGroup>
	<ScaleTransform3D ScaleY="2" />
	<RotateTransform3D>
		<RotateTransform3D.Rotation>
			<AxisAngleRotation3D Axis="0,1,0" Angle="25" />
		</RotateTransform3D.Rotation>
	</RotateTransform3D>
</Transform3DGroup>
\end{lstlisting}

\newpage{}

\subsection{Maticová transformace}

Maticová transformace umožňuje veškeré akce jako předchozí transformace a co víc, není třeba využívat Transform3DGroup, což umožňuje vyšší výkon.

\begin{figure}[h!tb]
\begin{center}
\includegraphics[width=0.65\textwidth]{img/matrix}
\end{center}
\caption{Maticová tranformace}
\label{fig:matrix}
\end{figure}

Jediným parametrem této transformace je \textit{Matrix}, tedy 4x4 matice. Prvními třemi čísli na diagonále lze nastavit \textit{scaling} a poslední řádka (tedy první 3 čísla) nastavuje posuv.

\lstset{
	caption=Nastavení dvojnásobného zvětšení po Y a posuv o 3 v ose X,
  language = xml,
	breaklines=true,
  showspaces = false,
  showstringspaces=false,
  showtabs = false,
  basicstyle = \ttfamily\footnotesize,
	tabsize=2,
	frame=single
	}
\begin{lstlisting}
<MatrixTransform3D Matrix="
1,0,0,0,                              
0,2,0,0,
0,0,1,0,                         
3,0,0,1" />
\end{lstlisting}

% TODO dodelat !!!
